//!
/**
 ***********************************************************************************************************
 * <RBMemoryTracker Implementation>
 ***********************************************************************************************************
 * @file RBMemoryTracker.cpp
 ***********************************************************************************************************/

/***********************************************************************************************************
 * Precompiled Header
 ***********************************************************************************************************/
#include "RBMainPCH.h"

/***********************************************************************************************************
 * Includes
 ***********************************************************************************************************/
#include "RBMemoryTracker.h"

#include "RBMemoryManager.h"
#include "RBMemoryManagerOff.h"
#include "RBMemoryManagerOn.h"

#include <Windows.h>

/***********************************************************************************************************
 * Defines
 ***********************************************************************************************************/

/***********************************************************************************************************
 * Classes implementation
 ***********************************************************************************************************/


/***********************************************************************************************************
 *
 ***********************************************************************************************************/
RBMemoryTracker::RBMemoryTracker()
{
    RBMemoryManager::TrackMemory = true; 
}

/***********************************************************************************************************
 *
 ***********************************************************************************************************/
RBMemoryTracker::~RBMemoryTracker()
{
    RBMemoryManager::TrackMemory = false; 

    bool bHasMemLeaks = RBMemoryManager::HasMemLeaks();

    if (bHasMemLeaks)
    {
        RBString strLeaksMessages = RBMemoryManager::GetLeaksDescription();
        ::OutputDebugString(strLeaksMessages.c_str());
        UNUSED(strLeaksMessages);
    }

}

/***********************************************************************************************************
 *
 ***********************************************************************************************************/
void RBMemoryTracker::TrackMemory(void* pMemory)
{
    RBMemoryManager::TrackMemory = false; 
    m_sAllocatedData.insert(pMemory);
    RBMemoryManager::TrackMemory = true; 
}

/***********************************************************************************************************
 *
 ***********************************************************************************************************/
bool RBMemoryTracker::IsMemoryTracked(void* pMemory, bool bRemoveTracking)
{
    RBMemoryManager::TrackMemory = false; 

    stdext::hash_set<void*>::iterator iter = m_sAllocatedData.find(pMemory);
    bool bIsMemoryTracked = (iter != m_sAllocatedData.end());
    if (bIsMemoryTracked && bRemoveTracking)
    {
        m_sAllocatedData.erase(iter);
    }
    RBMemoryManager::TrackMemory = true; 

    return bIsMemoryTracked;
}
